/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.controlador;

import java.io.Serializable;
import java.util.Date;
import java.util.logging.Level;
import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.log4j.Logger;
import org.springframework.context.annotation.Scope;
import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.scp.common.IObserver;
import pe.com.cotelasa.scp.controlador.backingBean.BKVentaLineaCredito;
import pe.com.cotelasa.scp.controlador.backingBean.BKVentaLineaCreditoDetalle;
import pe.com.cotelasa.scp.dominio.common.ESTADO_RESULTADO;
import pe.com.cotelasa.scp.dominio.common.ResultadoServicio;
import pe.com.cotelasa.scp.dominio.common.TIPO_DOC_VENTA;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioVentaLineaCredito;
import pe.com.cotelasa.scp.dominio.service.IServicioVentaLineaCreditoDetalle;
import pe.com.cotelasa.scp.entidad.Cliente;
import pe.com.cotelasa.scp.entidad.VentaFacturacion;
import pe.com.cotelasa.scp.entidad.VentaLineaCredito;
import pe.com.cotelasa.scp.entidad.VentaLineaCreditoDetalle;

/**
 *
 * @author Jorge
 */
@Named(value = "MBVentaLineaCredito")
@Scope("request")
public class MBVentaLineaCredito extends MBGenerico implements IMantenedor, IObserver, Serializable {

    private static Logger logger = Logger.getLogger(MBVentaLineaCredito.class);
    @Inject
    private BKVentaLineaCredito bkVentaLineaCredito;
    @Inject
    private BKVentaLineaCreditoDetalle bkVentaLineaCreditoDetalle;
    @Inject
    private IServicioVentaLineaCredito servicioVentaLineaCredito;
    @Inject
    private IServicioVentaLineaCreditoDetalle servicioVentaLineaCreditoDetalle;
    @Inject
    private MBComponenteFindCliente mbComponenteFindCliente;

    @Override
    public String actualizar() {
        boolean primerCredito = bkVentaLineaCredito.getVentaLineaCreditoSeleccionado().getCreditoBase();

        double credito = bkVentaLineaCredito.getCredito() + bkVentaLineaCredito.getMonto();
        double usado = bkVentaLineaCredito.getVentaLineaCreditoSeleccionado().getLineaUsada();
        bkVentaLineaCredito.getVentaLineaCreditoSeleccionado().setLineaCredito(credito);
        bkVentaLineaCredito.getVentaLineaCreditoSeleccionado().setLineaSaldo(credito - usado);
        bkVentaLineaCredito.getVentaLineaCreditoSeleccionado().setCreditoBase(Boolean.TRUE);
        servicioVentaLineaCredito.actualizarLineaCredito(bkVentaLineaCredito.getVentaLineaCreditoSeleccionado());

        if (!primerCredito) {
            VentaLineaCreditoDetalle detalle = new VentaLineaCreditoDetalle();
            detalle.setDetalleCredito("Apertura de Credito");
            detalle.setMontoCredito(bkVentaLineaCredito.getCredito());
            detalle.setFechaOperacion(new Date());
            detalle.setLineaSaldo(detalle.getMontoCredito());
            detalle.setIdlinea(bkVentaLineaCredito.getVentaLineaCreditoSeleccionado());
            servicioVentaLineaCreditoDetalle.guardarLineaCreditoDetalle(detalle);
        } else {
            VentaLineaCreditoDetalle detalle = new VentaLineaCreditoDetalle();
            detalle.setDetalleCredito("Actualización de Credito");
            detalle.setMontoCredito(bkVentaLineaCredito.getMonto());
            detalle.setFechaOperacion(new Date());
            detalle.setLineaSaldo(bkVentaLineaCredito.getVentaLineaCreditoSeleccionado().getLineaSaldo());
            detalle.setIdlinea(bkVentaLineaCredito.getVentaLineaCreditoSeleccionado());
            servicioVentaLineaCreditoDetalle.guardarLineaCreditoDetalle(detalle);
        }

        this.buscar();
        return null;
    }

    @Override
    public String guardar() {
        ResultadoServicio rs = servicioVentaLineaCredito.guardarLineaCredito(bkVentaLineaCredito.getVentaLineaCreditoFormulario());
        if (rs.getEstadoResultado() == ESTADO_RESULTADO.EXITOSO) {
            mostrarMensaje(rs.getMensaje());
        } else if (rs.getEstadoResultado() == ESTADO_RESULTADO.OBSERVADO) {
            mostrarWarning(rs.getMensaje());
        }

        this.buscar();
        return null;
    }

    @Override
    public void eliminar(ActionEvent actionEvent) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String editar() {

        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String nuevo() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String ver() {
        try {
            bkVentaLineaCreditoDetalle.setListaVentaLineaCreditoDetalle(servicioVentaLineaCreditoDetalle.obtenerVentaLineaCreditoDetalle(bkVentaLineaCredito.getVentaLineaCreditoSeleccionado()));

        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
        return URLPaginacion.Ventas.URL_DETALLE_LINEA_CREDITO;
    }

    @Override
    public String aceptar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String retroceder() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String cancelar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void seleccionar() {
        if (bkVentaLineaCredito.getVentaLineaCreditoSeleccionado().getCreditoBase()) {
            bkVentaLineaCredito.setMonto(0);
            bkVentaLineaCredito.setCredito(bkVentaLineaCredito.getVentaLineaCreditoSeleccionado().getLineaCredito());
            bkVentaLineaCredito.setEstado(Boolean.FALSE);
        } else {
            bkVentaLineaCredito.setMonto(0);
            bkVentaLineaCredito.setCredito(0);
            bkVentaLineaCredito.setEstado(Boolean.TRUE);
        }

    }

    @Override
    public void actualizarObservador(Object object) {
        if (object instanceof Cliente) {
            Cliente cliente = (Cliente) object;
            bkVentaLineaCredito.setVentaLineaCreditoFormulario(new VentaLineaCredito());
            bkVentaLineaCredito.getVentaLineaCreditoFormulario().setRasonSocial(cliente.getRazonSocial());
            bkVentaLineaCredito.getVentaLineaCreditoFormulario().setRuc(cliente.getNumeroDocumento());
            bkVentaLineaCredito.getVentaLineaCreditoFormulario().setFechaReg(new Date());
            bkVentaLineaCredito.getVentaLineaCreditoFormulario().setLineaCredito(0.0);
            bkVentaLineaCredito.getVentaLineaCreditoFormulario().setLineaSaldo(0.0);
            bkVentaLineaCredito.getVentaLineaCreditoFormulario().setLineaUsada(0.0);
            bkVentaLineaCredito.getVentaLineaCreditoFormulario().setCreditoBase(Boolean.FALSE);
            this.guardar();
        }
    }

    public String mostrar() {
        mbComponenteFindCliente.clearObserver();
        mbComponenteFindCliente.addObserver(this);
        bkVentaLineaCredito.setListaVentaLineaCredito(null);

        return URLPaginacion.Ventas.URL_LISTA_LINEA_CREDITO;
    }

    public void exportar() {
    }

    public void buscar() {
        try {
            bkVentaLineaCredito.setListaVentaLineaCredito(servicioVentaLineaCredito.obtenerVentaLineaCreditoCliente(bkVentaLineaCredito.getRazon()));

        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }
}
